package demo1;

import java.util.Arrays;

/**
 * Created with IntelliJ IDEA.
 * Description:
 * User: 87111
 * Date: 2025-09-02
 * Time: 13:13
 */
public class MyArrayList implements IList {
    public int[] arr;
    public int arrTrueSize;
    private static final int ARR_SIZE = 5;
    public MyArrayList() {
        arr = new int[ARR_SIZE];
    }
    public MyArrayList(int size) {
        arr = new int[size];
    }

    //添加元素到最后一个位置
    @Override
    public void add(int data) {
        //判断数组是否已满
        if(isFull()) {
            //扩容
            grow();
        }
        arr[arrTrueSize] = data;
        arrTrueSize++;
    }

    //2倍扩容
    private void grow() {
        arr = Arrays.copyOf(arr,2*ARR_SIZE);
    }

    //在指定pos位置添加元素
    @Override
    public void add(int pos, int data) {
        checkPosOfAdd(pos);
        //如果数组满了
        if(isFull()) {
            grow();
        }
        for(int i = arrTrueSize - 1; i >= pos; i--) {
            arr[i+1] = arr[i];
        }
        arr[pos] = data;
        arrTrueSize++;
    }

    //检查pos范围是否正常
    private void checkPosOfAdd(int pos) {
        if(pos < 0 || pos > arrTrueSize) {
            throw new PosOutOfBoundsException("添加元素位置的pos不合法，请重新输入" + pos);
        }
    }

    //判断是否包含某元素
    @Override
    public boolean contains(int toFind) {
        for (int i = 0; i < arrTrueSize; i++) {
            if(arr[i] == toFind) {
                return true;
            }
        }
        return false;
    }

    //查找某个元素对应的下标
    @Override
    public int indexOf(int toFind) {
        for (int i = 0; i < arrTrueSize; i++) {
            if(arr[i] == toFind) {
                return i;
            }
        }
        return -1;
    }

    //获取pos位置对应的元素
    @Override
    public int get(int pos) {
        checkPosOfGetOrSet(pos);
        if(isEmpty()) {
            throw new ListEmptyException("获取元素时，顺序表为空");
        }
        return arr[pos];
    }

    //判断get方法中的pos范围是否合法
    private void checkPosOfGetOrSet(int pos) {
        if(pos < 0 || pos >= arrTrueSize) {
            throw new PosOutOfBoundsException("获取或者设置元素位置的pos不合法" + pos);
        }
    }

    //设置pos位置的元素为value
    @Override
    public void set(int pos, int value) {
        checkPosOfGetOrSet(pos);
        arr[pos] = value;
    }

    //删除第一次出现的元素
    @Override
    public void remove(int toRemove) {
        int index = indexOf(toRemove);
        if(index == -1) {
            System.out.println("没有你要删除的元素");
        }
        for (int i = index; i < arrTrueSize - 1; i++) {
            arr[i] = arr[i+1];
        }
        arrTrueSize--;
    }

    //获取顺序表里面的数据数量
    @Override
    public int size() {
        return arrTrueSize;
    }

    //清空顺序表
    @Override
    public void clear() {
        arrTrueSize = 0;
    }

    @Override
    public void display() {
        for (int i = 0; i < arrTrueSize; i++) {
            System.out.print(arr[i] + " ");
        }
        System.out.println();
    }

    //判断顺序表是否满了
    @Override
    public boolean isFull() {
        return arrTrueSize == arr.length;
    }

    //判断顺序表是否为空
    @Override
    public boolean isEmpty() {
        return arrTrueSize == 0;
    }
}
